export const metadata = {
  sidebar_position: 4,
  title: "🟢 Створити ChatGPT з GPT-3",
};

# 🟢 Створити ChatGPT з GPT-3

<div style={{ textAlign: "left" }}>
  <Image
    src="/docs/assets/basic_applications/skippy_chatbot_header.webp"
    width={800}
    height={281}
    style={{ width: "700px", margin: "auto" }}
  />
</div>

## Вступ

[ChatGPT](https://chat.openai.com/chat) набув шаленої популярності за останній місяць, отримавши мільйон користувачів лише за тиждень. Дивно, але основна модель, GPT-3, дебютувала у 2020 році та була випущена для загального доступу

<a href="https://openai.com/blog/api-no-waitlist/">понад рік тому!</a>

Для тих, хто не знає, ChatGPT — це нова мовна модель від OpenAI, яка була доопрацьована з GPT-3 для оптимізації спілкування (@chatgpt2022). Вона має зручний інтерфейс чату, у якому ви можете вказати вхідні дані та отримати відповідь від помічника на основі ШІ. Ви можете знайти його на сайті [chat.openai.com](https://chat.openai.com/chat).

Хоча ранні версії GPT-3 не були такими просунутими, як поточна серія GPT-3.5, вони все одно приємно вражали. Ці моделі доступні через API та

<a href="https://beta.openai.com/playground">платформи вебінтерфейсу</a>, який дозволяє
налаштовувати певні гіперпараметри конфігурації та пробні запити. GPT-3 отримав значну
популярність, але він не наблизився до вірусного розповсюдження ChatGPT.

Що робить ChatGPT таким успішним у порівнянні з GPT-3, так це його доступність як безпосереднього помічника на основі ШІ для звичайної людини, незалежно від її знань у галузі даних, мовних моделей чи ШІ.

У цій статті я розглядаю, як чат-боти, такі як ChatGPT, можуть бути розроблені за допомогою великої мовної моделі, як-от GPT-3.

## Мотивація

Ця стаття була написана частково завдяки твіту від

<a href="https://twitter.com/goodside">Райлі Гудсайд</a>, у якому зазначено, як можна
було б розробити ChatGPT.

<blockquote class="twitter-tweet">
  <p lang="en" dir="ltr">
    Як створити власний підробний ChatGPT за допомогою GPT‑3
    (text‑davinci‑003) — де ви можете налаштувати правила відповідно до своїх
    потреб і отримати доступ до створеного чат-бота через API.
    <a href="https://t.co/9jHrs91VHW">pic.twitter.com/9jHrs91VHW</a>
  </p>
  &mdash; Райлі Гудсайд
  <a href="https://twitter.com/goodside/status/1607487283782995968?ref_src=twsrc%5Etfw">
    26 грудня 2022 р.
  </a>
</blockquote>

<script
  async
  src="https://platform.twitter.com/widgets.js"
  charset="utf-8"
></script>

Як і інші моделі серії GPT-3.5, ChatGPT було навчено за допомогою [RLHF](https://huggingface.co/blog/rlhf), але більша частина його ефективності залежить від використання **потрібного запиту**.

## Запит

<div style={{ textAlign: "left" }}>
  <Image
    src="/docs/assets/basic_applications/skippy_chatbot.webp"
    width={800}
    height={303}
    style={{ width: "700px", margin: "auto" }}
  />

  <p style={{ color: "gray", fontSize: "12px", fontStyle: "italic" }}>
    Повний запит чат-бота Скіппі із заголовка статті
  </p>
</div>

<a href="https://learnprompting.org/docs/basics/prompting">
  Здійснення пошуку за запитом — це процес надання вказівок ШІ щось зробити.
</a>
Як ви, напевно, бачили в прикладах ChatGPT в Інтернеті, ви можете надати йому запит
зробити будь-що. Типовими прикладами його використання є анотування тексту, написання
контенту на основі опису або створення таких речей, як вірші, рецепти та багато іншого.

<p></p>

ChatGPT — це і мовна модель, і інтерфейс користувача. Запит, введений користувачем до інтерфейсу, фактично вставляється в більший запит, який містить увесь діалог між користувачем і ChatGPT. Це дозволяє базовій мовній моделі зрозуміти контекст розмови та відповідати належним чином.

<div style={{ textAlign: "left" }}>
  <Image
    src="/docs/assets/basic_applications/chatgpt_ui_diagram.webp"
    width={774}
    height={196}
    style={{ width: "600px", margin: "auto" }}
  />

  <p style={{ color: "gray", fontSize: "12px", fontStyle: "italic" }}>
    Приклад вставки запиту користувача перед надсиланням його до моделі
  </p>
</div>

Мовна модель доповнює запит, з’ясовуючи, які слова будуть наступними на основі ймовірностей, які вона вивчила під час попередньої підготовки (@jurafsky2009).

<p></p>

GPT-3 здатний "навчатися" з простих вказівок або кількох прикладів у запиті. Останнє називається методом кількох прикладів, або навчанням за контекстом (@brown2020language). У запиті вище я створюю фіктивного чат-бота під назвою Skippy і даю йому вказівку надавати відповіді користувачам. GPT-3 підбирає зворотний формат, `КОРИСТУВАЧ: {user input}` і `СКІППІ: {skippy response}`. GPT-3 розуміє, що Скіппі — це чат-бот, а попередні обміни інформацією — це діалог, тому, коли ми надаємо вхідні дані наступного користувача, Скіппі відреагує.

### Запам'ятовування

Попередні обміни інформацією між Скіппі та користувачем додаються до наступного запиту. Щоразу, коли ми надаємо більше вхідних даних користувачів і отримуємо більше результатів від чат-бота, запит розширюється, щоб включити цей новий обмін. Ось як чат-боти, такі як Skippy і ChatGPT, можуть **запам'ятовувати попередні введення.** Однак, існує обмеження на те, скільки чат-бот GPT-3 може запам’ятати.

Запити можуть стати об'ємними після кількох обмінів, особливо якщо ми використовуємо чат-бота для створення довгих відповідей, як-от дописів у блозі. Запити, надіслані до GPT-3, перетворюються на токени, які є окремими словами або їх частинами. Існує обмеження на

<a href="https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them">
  4097 токенів (приблизно 3000 слів)
</a>
для комбінованого запиту та згенерованої відповіді для моделей GPT-3, включно з ChatGPT.

### Кілька прикладів

Існує багато різних випадків використання запитів чат-бота, які зберігають попередні діалоги. ChatGPT був створений для того, щоб бути універсальним загальним помічником, і, з мого досвіду, він рідко вимагає додаткових дій.

#### Чат-бот Therapy, який запитує, як минув ваш день

Мати чат-бота, який активно ставить запитання та отримує зворотний зв'язок від користувача, може стати в пригоді. Нижче наведено приклад запиту чат-бота Therapy, який ставитиме запитання та відповідатиме, щоб допомогти користувачеві подумати про свій день.

<div style={{ textAlign: "left" }}>
  <Image
    src="/docs/assets/basic_applications/therapy_chatbot.gif"
    width={2068}
    height={1080}
    style={{ width: "700px", margin: "auto" }}
  />

  <p style={{ color: "gray", fontSize: "12px", fontStyle: "italic" }}>
    Запит для чат-бота Therapy
  </p>
</div>

#### Поговоріть із молодшим собою, використовуючи старі записи в щоденнику

<a href="https://twitter.com/michellehuang42">Мішель Хуан</a>
використовувала GPT-3, щоб поспілкуватися з молодшою собою. Запит використовує певний
контекст, у цьому випадку старі записи щоденника, у поєднанні з форматом чат-бота.
GPT-3 здатний імітувати людську особистість на основі цих записів.

<p></p>

<blockquote class="twitter-tweet">
  <p lang="en" dir="ltr">
    я показала чат-боту на основі ШІ записи у щоденнику мого дитинства, щоб я
    могла вести діалог у реальному часі зі своєю &quot;внутрішньою дитиною&quot;
    <br />
    <br />
    кілька прикладів нижче:
  </p>
  &mdash; Мішель Хуан
  <a href="https://twitter.com/michellehuang42/status/1597005489413713921?ref_src=twsrc%5Etfw">
    27 листопада 2022 р.
  </a>
</blockquote>

<script
  async
  src="https://platform.twitter.com/widgets.js"
  charset="utf-8"
></script>

Запит із твіту:

```markdown
Нижче наведено розмову з дорослою Мішель (вік [redacted]) і юною Мішель (14 років).

Юна Мішель вносила такі записи в щоденнику:
[записи в щоденнику тут]

Доросла Мішель: [введіть тут свої запитання]
```

Автор зазначає, що записи в щоденнику можуть досягати обмеження токенів. У цьому випадку ви можете вибрати кілька записів або спробувати коротко узагальнити декілька записів.

## Імплементація

Я розповім про кодування простого чат-бота на базі GPT-3 мовою Python. Включити GPT-3 у програму, яку ви створюєте, неймовірно легко за допомогою OpenAI API. Вам потрібно буде створити обліковий запис на OpenAI та отримати ключ API. Перегляньте їхні документи

<a href="https://beta.openai.com/docs/introduction">тут.</a>

Огляд того, що нам потрібно зробити:

1. Відформатуйте введені користувачем вхідні дані в запит чат-бота для GPT-3
2. Отримайте відповідь чат-бота як завершення GPT-3
3. Оновіть запит як введенням даних користувача, так і відповіддю чат-бота
4. Цикл

Ось запит, який я використаю. Ми можемо використовувати мову Python для заміни
{"<conversation history\>"}
і
{"<user input\>"}
для їхніх фактичних значень.

```python
chatbot_prompt = """
    Як для просунутого чат-бота, ваша головна мета — якнайкраще допомагати користувачам. Це може охоплювати відповіді на запитання, надання корисної інформації або виконання завдань на основі вхідних даних користувача. Щоб ефективно допомагати користувачам, важливо бути детальними та ґрунтовними у своїх відповідях. Використовуйте приклади та докази, щоб підтвердити свої думки та обґрунтувати свої рекомендації чи рішення.


<conversation history>

    User:
<user input>
    Chatbot:"""
```

Я відстежую як наступні вхідні дані користувача, так і попередній діалог. Новий обмін даними між чат-ботом і користувачем додається до кожного циклу.

```python
import openai

openai.api_key = "YOUR API KEY HERE"
model_engine = "text-davinci-003"
chatbot_prompt = """
Як для просунутого чат-бота, ваша головна мета — якнайкраще допомагати користувачам. Це може охоплювати відповіді на запитання, надання корисної інформації або виконання завдань на основі вхідних даних користувача. Щоб ефективно допомагати користувачам, важливо бути детальними та ґрунтовними у своїх відповідях. Використовуйте приклади та докази, щоб підтвердити свої думки та обґрунтувати свої рекомендації чи рішення.

<conversation history>

User:
<user input>
Chatbot:"""


def get_response(conversation_history, user_input):
    prompt = chatbot_prompt.replace("<conversation history>", conversation_history).replace("<user input>", user_input)

    # Get the response from GPT-3
    response = openai.Completion.create(
        engine=model_engine, prompt=prompt, max_tokens=2048, n=1, stop=None, temperature=0.5)

    # Extract the response from the response object
    response_text = response["choices"][0]["text"]

    chatbot_response = response_text.strip()

    return chatbot_response


def main():
    conversation_history = ""

    while True:
        user_input = input(">")
        if user_input == "exit":
            break
        chatbot_response = get_response(conversation_history, user_input)
        print(f"Chatbot: {chatbot_response}")
        conversation_history += f"User: {user_input}\nChatbot: {chatbot_response}\n"

main()
```

<a href="https://gist.github.com/jayo78/79d8834e6e31bf942c7b604e1611b68d">
  Ось посилання
</a>
на повний код простого чат-бота.

<p></p>

Тепер усе, що залишилося, це створити гарний інтерфейс, із яким користувачі зможуть взаємодіяти!

Автор: [jayo78](https://twitter.com/jayo782).
